#include<stdio.h>
#include<unistd.h>
#include<errno.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/wait.h>
#define N 10
#define TASK_NUM 10

typedef void(*task_t)();
task_t tasks[TASK_NUM];

void task1(){
    printf("这是一个执行打印日志的任务,pid:%d\n",getpid());
}
void task2(){
    printf("这是一个执行检测网络健康状态的一个任务,pid:%d\n",getpid());
}
void task3(){
    printf("这是一个进行绘制图形界面的任务,pid:%d\n",getpid());
}
int ADDTask(task_t t);

//任务的管理代码
void InitTask(){
    for(int i=0;i<TASK_NUM;i++){
        tasks[i]=NULL;
    }
    ADDTask(task1);
    ADDTask(task2);
    ADDTask(task3);
}
int ADDTask(task_t t){
    int pos=0;
    for(;pos<TASK_NUM;pos++){
        if(!tasks[pos])break;
    }
    if(pos==TASK_NUM)return -1;
    tasks[pos]=t;
    return 0;


}
int DelTask(task_t t){
    int pos=0;
    for(;pos<TASK_NUM;pos++){
        if(tasks[pos]==t)break;
    }
    if(pos==TASK_NUM)return -1;
    int i=pos;
    if(pos==TASK_NUM-1)tasks[pos]=NULL;
    while(i<TASK_NUM-1){
        tasks[i]=tasks[i+1];
        i++;
    }

    return 0;

}


void ExecuteTask(){
    for(int i=0;i<TASK_NUM;i++){
        if(!tasks[i])continue;
        tasks[i]();
        //tasks[i]=NULL;
    }
}
//void Runchild(){
//  int cnt=5;
//  while(cnt){
//    printf("i am child process,pid:%d,ppid:%d\n",getpid(),getppid());
//    sleep(1);
//    cnt--;
//  }
//}
//int main(){
//    for(int i=0;i<N;i++){
//    pid_t id=fork();
//    if(id==0){
//      Runchild();
//      exit(i);
//    }
//    printf("create child process:%d success\n",id);
//  }
//  //sleep(10);
//  //等待
//  for(int i=0;i<N;i++)
//  {
//    //pid_t id=wait(NULL);
//    int status=0;
//    pid_t id=waitpid(-1,&status,0);
//    if(id>0){
//      printf("wait %d success,exit code:%d\n",id,WEXITSTATUS(status));
//    }
//
//  }
//  sleep(5);
//  return 0;
//}
int main(){
  pid_t id=fork();  
  if(id<0){
    perror("fork");
    return 1;
  }
  else if(id==0){
    int cnt=5;
    while(cnt){
      printf("i am child,pid:%d,ppid:%d,cnt=%d\n",getpid(),getppid(),cnt);
      cnt--;
      sleep(1);
    }
    exit(11);
  }
  else{
   // int cnt=5;
   // while(cnt){
   //   printf("i am parent,pid:%d,ppid:%d,cnt:%d\n",getpid(),getppid(),cnt--);
   //   sleep(1);
   //   
   // }
   // //wait等待任意一个进程退出
    //pid_t ret=wait(NULL);
    int status=0;
    InitTask();

    //pid_t ret=waitpid(id,&status,0);
    while(1){//轮询
       pid_t ret=waitpid(id,&status,WNOHANG);//非阻塞

       if(ret>0){
         //printf("wait success,ret:%d,exit sig:%d,exit status:%d\n",ret,status&0x7f,status>>8);
           if(WIFEXITED(status)){
               printf("进程是正常跑完的,退出码:%d\n",WEXITSTATUS(status));
           }
           else{
               printf("进程出异常了,信号:%d\n",WIFEXITED(status));
           }
           break;

       }
       else if(ret<0){
           printf("wait fail\n");
           break;
       }
       else{
           //printf("子进程还没有退出,我在等等\n");
          // sleep(1);
          ExecuteTask();
          usleep(500000);
       }
    }
    sleep(3);
  }
  return 0;
}
////int main(){
////  char*p=(char*)malloc(1000*1000*1000*4);
////  perror("malloc file");
////  return errno;
////}
